import os


d = os.path.dirname('.')  # 获得文件所在目录
py_dir = os.path.abspath(d)  # 设置当前目录为绝对路径
os.chdir(py_dir)  # 将当前目录设置为工作目录


# 99乘法表函数
def nine_nine_multi_table(ideas, writing):
    """
    自定义99乘法表函数
    :param ideas:  循环思路
    :param writing:  写法
    :return:
    """
    if ideas == 'while':  # 判断是否为white思路
        if writing == 'left_down':  # 判断是否为左下角写法
            i = 1
            while i <= 9:
                j = 1
                while j <= i:
                    print('{}*{}={:<3}'.format(j, i, j * i), end=' ')
                    j += 1
                i += 1
                print('')
        elif writing == 'left_up':  # 判断是否为左上角写法
            i = 9
            while i >= 1:
                j = 1
                while j <= i:
                    print('{}*{}={:<3}'.format(j, i, j * i), end=' ')
                    j += 1
                i -= 1
                print('')
        elif writing == 'right_down':  # 判断是否为右下角写法
            i = 1
            while i <= 9:
                a = 1
                while a <= 9 - i:
                    print(end='        ')
                    a += 1
                j = i
                while j >= 1:
                    print('{}*{}={:<3}'.format(j, i, j * i), end=' ')
                    j -= 1
                i += 1
                print('')
        elif writing == 'right_up':  # 判断是否为右上角写法
            i = 9
            while i >= 1:
                a = 1
                while a <= 9 - i:
                    print(end='        ')
                    a += 1
                j = i
                while j >= 1:
                    print('{}*{}={:<3}'.format(j, i, j * i), end=' ')
                    j -= 1
                i -= 1
                print('')
        else:  # form格式错误
            raise TypeError('form格式错误')
    elif ideas == 'for':  # 判断是否为for思路
        if writing == 'left_down':  # 判断是否为左下角写法
            for i in range(1, 10):
                for j in range(1, i + 1):
                    print('{}*{}={:<3}'.format(j, i, j * i), end=' ')
                print('')
        elif writing == 'left_up':  # 判断是否为左上角写法
            for i in range(9, 0, -1):
                for j in range(1, i + 1):
                    print('{}*{}={:<3}'.format(j, i, j * i), end=' ')
                print('')
        elif writing == 'right_down':  # 判断是否为右下角写法
            for i in range(1, 10):
                for a in range(1, 10 - i):
                    print(end='        ')
                for j in range(i, 0, -1):
                    print('{}*{}={:<3}'.format(j, i, j * i), end=' ')
                print('')
        elif writing == 'right_up':  # 判断是否为右上角写法
            for i in range(9, 0, -1):
                for a in range(1, 10 - i):
                    print(end='        ')
                for j in range(i, 0, -1):
                    print('{}*{}={:<3}'.format(j, i, j * i), end=' ')
                print('')
        else:  # form格式错误
            raise TypeError('form格式错误')
    else:  # ideas格式错误
        raise TypeError('ideas格式错误')


# 统计目录大小函数
def statistic_dir_size(cu_dir):
    """
    自定义统计目录大小函数
    :param cu_dir:  文件或者文件夹
    :return:  文件大小
    """
    result = 0  # 预设文件大小为0
    if os.path.isfile(cu_dir):  # 判断是否为文件
        result += os.path.getsize(cu_dir)  # 获取文件大小
    elif os.path.isdir(cu_dir):  # 判断是否为文件夹
        sub_dir = os.listdir(cu_dir)  # 获取文件夹中的子文件或子文件夹为列表
        for i in sub_dir:  # 提取列表中元素
            sub_file = os.path.join(cu_dir, i)  # 组合子文件或子文件夹路径
            if os.path.isfile(sub_file):  # 判断子文件是否为文件
                result += os.path.getsize(sub_file)  # 获取子文件大小
            elif os.path.isdir(sub_file):  # 判断子文件是否为文件夹
                result += statistic_dir_size(sub_file)  # 递归调用统计目录大小函数，重复上述操作
            else:
                pass
    else:  # cu_dir格式错误
        raise TypeError('cu_dir格式错误')
    return result  # 输出文件大小


# 自定义ATM操作界面类
class bank_atm(object):
    """
    自定义此类具有查询、取款、存款和退出方法
    """
    def __init__(self, user):
        assert isinstance(user, dict)
        self.user = user

    def inquire(self):  # 查询方法
        print('=' * 12, '查询结果', '=' * 12)
        print('用户名称：{}\n用户余额：{}'.format(self.user['name'], self.user['deposits']))

    def withdraw_money(self, x):  # 取款方法
        print('=' * 12, '取款结果', '=' * 12)
        print('取款成功')
        self.user['deposits'] = self.user['deposits'] - x
        print('目前账户余额：{}'.format(self.user['deposits']))

    def save_money(self, x):  # 存款方法
        print('=' * 12, '存款结果', '=' * 12)
        print('存款成功')
        self.user['deposits'] = self.user['deposits'] + x
        print('目前账户余额：{}'.format(self.user['deposits']))

    def log_out(self):  # 退出方法
        pass


# 作业第一题
def homework_one():
    print('while思路99乘法表，左下角写法')
    nine_nine_multi_table(ideas='while', writing='left_down')
    print('\n' + '=' * 80)
    print('while思路99乘法表，左上角写法')
    nine_nine_multi_table(ideas='while', writing='left_up')
    print('\n' + '=' * 80)
    print('while思路99乘法表，右下角写法')
    nine_nine_multi_table(ideas='while', writing='right_down')
    print('\n' + '=' * 80)
    print('while思路99乘法表，右上角写法')
    nine_nine_multi_table(ideas='while', writing='right_up')
    print('\n' + '=' * 80)
    print('for思路99乘法表，左下角写法')
    nine_nine_multi_table(ideas='for', writing='left_down')
    print('\n' + '=' * 80)
    print('for思路99乘法表，左上角写法')
    nine_nine_multi_table(ideas='for', writing='left_up')
    print('\n' + '=' * 80)
    print('for思路99乘法表，右下角写法')
    nine_nine_multi_table(ideas='for', writing='right_down')
    print('\n' + '=' * 80)
    print('for思路99乘法表，右上角写法')
    nine_nine_multi_table(ideas='for', writing='right_up')
    print('\n' + '=' * 80)


# 作业第二题
def homework_two():
    print('例子：统计当前所在工作目录大小')
    size = statistic_dir_size(py_dir)
    print('当前文件所在工作目录大小：{}'.format(size))


# 作业第三题
def homework_three():
    # 创建ATM用户信息
    account_info = [
        {'bank_id': '1', 'password': '1', 'name': '张业', 'deposits': 5000.0},
        {'bank_id': '2', 'password': '2', 'name': '李四', 'deposits': 10000.0},
        {'bank_id': '3', 'password': '3', 'name': '王五', 'deposits': 8000.0},
        {'bank_id': '4', 'password': '4', 'name': '赵六', 'deposits': 3000.0}]
    while True:
        # 输出ATM登录界面
        print('=' * 12 + '自动取款机登录界面' + '=' * 12)
        print('{:16}{:5}'.format(' ', '1.登录'))
        print('{:16}{:5}'.format(' ', '2.退出'))
        print('=' * 40)
        key1 = input('请输入对应的选择：')
        # 根据输入操作值，执行对应操作
        if key1 == '1':
            a_number, p_number = input('请输入账户及密码(用,号隔开)：').split(',')
            for user in account_info:
                if user['bank_id'] == a_number and user['password'] == p_number:
                    while True:
                        # 输出ATM操作界面
                        print('=' * 15 + 'ATM操作界面' + '=' * 15)
                        print('{:5} {:<13} {:<5}'.format(' ', '1. 查询', '2. 取款'))
                        print('{:5} {:<13} {:<5}'.format(' ', '3. 存款', '4. 推出系统'))
                        print('=' * 40)
                        ba = bank_atm(user)
                        key2 = input('请输入对应的选择')
                        # 根据输入操作值，执行对应操作
                        if key2 == '1':
                            ba.inquire()
                            input('按回车继续：')
                        elif key2 == '2':
                            withdraw_number = input('请输入取款金额：')
                            ba.withdraw_money(float(withdraw_number))
                            input('按回车继续：')
                        elif key2 == '3':
                            save_number = input('请输入存款金额：')
                            ba.save_money(float(save_number))
                            input('按回车继续：')
                        elif key2 == '4':
                            ba.log_out()
                            print('=' * 12, 'ATM操作界面退出成功', '=' * 12)
                            break
                        else:
                            print('=' * 12, '操作无效', '=' * 12)
                elif user['bank_id'] == a_number and user['password'] != p_number:
                    print('密码错误')
                else:
                    pass
        elif key1 == '2':
            print('=' * 12, '登录界面退出成功', '=' * 12)
            break
        else:
            print('=' * 12, '操作无效', '=' * 12)


if __name__ == '__main__':
    print('=' * 40 + '第一题' + '=' * 45)
    homework_one()
    print('\n' * 3)
    print('=' * 40 + '第二题' + '=' * 45)
    homework_two()
    print('\n' * 3)
    print('=' * 40 + '第三题' + '=' * 45)
    # 登录账户密码可用：1,1 or 2,2 or 3,3 or 4,4
    homework_three()

